package br.uniceub.fsw.agenda.model.facade;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.dao.CidadeDAO;
import br.uniceub.fsw.agenda.model.vo.CidadeVO;
import br.uniceub.fsw.agenda.model.dao.MenuDAO;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.model.dao.UFDAO;
import br.uniceub.fsw.agenda.model.vo.UFVO;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.util.List;

/**
 *
 * @author Bruno
 */
public class ManterCidadeFacade extends GenericFacade {

    /**
     * Busca todos os Menus
     * @return lista com objetos Menu
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<MenuVO> findAllMenu()
            throws DatabaseException, BusinessException {
        try {
            MenuDAO dao = new MenuDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todos as UFs
     * @return lista com objetos UF
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<UFVO> findAllUF()
            throws DatabaseException, BusinessException {
        try {
            UFDAO dao = new UFDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca uma UF
     * @return objeto UF
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public UFVO findUFBySigla(String sgUf)
            throws DatabaseException, BusinessException {
        try {
            UFDAO dao = new UFDAO(getConnection());
            return dao.findBySigla(sgUf);
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todas as Cidades
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidade()
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Cidades pela UF ou todas caso o parametro seja nulo
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidade(String sgUf)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            
            if(sgUf != null && sgUf.compareTo("") != 0) {
                return dao.findAllByUF(sgUf);
            } else {
                return dao.findAll();
            }
        } finally {
            closeConnection();
        }
    }
    
    public List<CidadeVO> findAllCidade(String noCidade, String sgUf)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            
            // Busca lista de Cidade
            if(StringUtils.isNullOrEmpty(noCidade) && StringUtils.isNullOrEmpty(sgUf)) {
                return dao.findAll();
            }
            
            // Busca lista de Cidade pelo nome
            if(!StringUtils.isNullOrEmpty(noCidade) && StringUtils.isNullOrEmpty(sgUf)) {
                return dao.findAllByNome(noCidade);
            }

            // Busca lista de Cidade por UF
            if(StringUtils.isNullOrEmpty(noCidade) && !StringUtils.isNullOrEmpty(sgUf)) {
                return dao.findAllByUF(sgUf);
            }

            // Busca lista de Cidade por UF e por parte do nome
            if(!StringUtils.isNullOrEmpty(noCidade) && !StringUtils.isNullOrEmpty(sgUf)) {
                return dao.findAllByNomeAndUF(noCidade, sgUf);
            }
            
            return null;
        } finally {
            closeConnection();
        }
            
    }
    
    /**
     * Busca a Cidade pela id
     * @param idCidade id do Cidade
     * @return objeto Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public CidadeVO findCidadeById(Integer idCidade)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findById(idCidade);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Cidades por parte do nome
     * @param dsCidade nome do cidade
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidadeByNome(String dsCidade)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAllByNome(dsCidade);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Cidades por uf
     * @param sgUf sigla da UF
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidadeByUF(String sgUf)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAllByUF(sgUf);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Cidades pelo nome e por uf
     * @param noCidade nome da cidade
     * @param sgUf sigla da UF
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidadeByNomeAndUF(String noCidade, String sgUf)
            throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAllByNomeAndUF(noCidade, sgUf);
        } finally {
            closeConnection();
        }
    }

    /**
     * Insere um novo cidade.
     * @param cidade
     * @return ID auto-increment gerada pra esse registro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public Integer inserirCidade(CidadeVO cidade)
            throws BusinessException, DatabaseException {
        try {
            String sgUf = cidade.getUf().getSgUf();
            String noCidade = cidade.getNoCidade();
            
            CidadeDAO dao = new CidadeDAO(getConnection());

            //tratamento de erros
            if(StringUtils.isNullOrEmpty(sgUf)) {
                throw new BusinessException("UF é obrigatória.");
            }
            if(StringUtils.isNullOrEmpty(noCidade)) {
                throw new BusinessException("Nome da cidade é obrigatório.");
            }
            
            return dao.insert(cidade);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Atualiza uma cidade.
     * @param cidade
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void alterarCidade(CidadeVO cidade)
            throws BusinessException, DatabaseException {
        try {
            String sgUf = cidade.getUf().getSgUf();
            String noCidade = cidade.getNoCidade();
            
            CidadeDAO dao = new CidadeDAO(getConnection());

            //tratamento de erros
            if(StringUtils.isNullOrEmpty(sgUf)) {
                throw new BusinessException("UF é obrigatória.");
            }
            if(StringUtils.isNullOrEmpty(noCidade)) {
                throw new BusinessException("Nome da cidade é obrigatório.");
            }
            
            dao.update(cidade);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Exclui um cidade.
     * @param cidade
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void excluirCidade(CidadeVO cidade)
            throws BusinessException, DatabaseException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            dao.delete(cidade);
        } finally {
            closeConnection();
        }        
    }

}
